#include "stm32f10x.h"                  // Device header
#include "delay.h"

void Off_All(void);

/***********************************************
* 流水灯
* 最小系统接法：将C8T6接到面包板上，
* 空2行，然后一边3.3V接正极，GND接地
* 另一边的3.3V也接正极，GND接地
* 将8个LED的负极分别接PA0~PA7，依次正极接板上正极
* 效果：从第一个LED依次向右亮，然后再从右向左亮
* author：dralee
* date: 2021.11.20
*************************************************/
int main(void)
{
	int8_t n = 0;
	uint8_t direct = 0;
	GPIO_InitTypeDef GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 
		| GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	while(1)
	{
		Off_All();
		switch(n)
		{
			case 0:
				GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); break;
			case 1:
				GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET); break;
			case 2:
				GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET); break;
			case 3:
				GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_RESET); break;
			case 4:
				GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET); break;
			case 5:
				GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET); break;
			case 6:
				GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_RESET); break;
			case 7:				
				GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_RESET); break;
			default:
				break;
		}
		delay_ms(100);
		if(direct == 0) // 向右
		{
			n++;
		}
		else // 向左
		{
			n--;
		}
		
		if(n > 7)
		{
			n = 7;
			direct = 1;
		}
		else if(n < 0){
			n = 0;
			direct = 0;
		}
	}
}

void Off_All(void)
{
	GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
	GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
	GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);
	GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_SET);
	GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
	GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
	GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_SET);
	GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_SET);
}
